package Intermediate_algorithm.Math;

import org.junit.Test;

import java.util.HashMap;

/*
Excel表列序号
给你一个字符串columnTitle ，表示 Excel 表格中的列名称。返回 该列名称对应的列序号。
例如：
A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28 
...

示例 1:
输入: columnTitle = "A"
输出: 1
示例2:
输入: columnTitle = "AB"
输出: 28
示例3:
输入: columnTitle = "ZY"
输出: 701

提示：
1 <= columnTitle.length <= 7
columnTitle 仅由大写英文组成
columnTitle 在范围 ["A", "FXSHRXW"] 内
相关标签
Java

作者：LeetCode
链接：https://leetcode.cn/leetbook/read/top-interview-questions-medium/xweb76/
 */
public class _03Excel表列序号 {

    @Test
    public void test() {
        System.out.println(titleToNumber("ZY"));
    }

    //AC
    //优化：map表优化为 int k = columnTitle.charAt(i) - 'A' + 1;
    public int titleToNumber(String columnTitle) {
        HashMap<Character, Integer> map = new HashMap<>(){{
            put('A', 1);
            put('B', 2);
            put('C', 3);
            put('D', 4);
            put('E', 5);
            put('F', 6);
            put('G', 7);
            put('H', 8);
            put('I', 9);
            put('J', 10);
            put('K', 11);
            put('L', 12);
            put('M', 13);
            put('N', 14);
            put('O', 15);
            put('P', 16);
            put('Q', 17);
            put('R', 18);
            put('S', 19);
            put('T', 20);
            put('U', 21);
            put('V', 22);
            put('W', 23);
            put('X', 24);
            put('Y', 25);
            put('Z', 26);
        }};
        int result = 0;
        char[] charArray = columnTitle.toCharArray();
        for (int i = 0; i < charArray.length; i++) {
            char c = charArray[i];
            int value = map.get(c);
            result *= 26;
            result += value;
        }
        return result;
    }

    //官解：方法一：进制转换
    /*
    作者：力扣官方题解
    链接：https://leetcode.cn/problems/excel-sheet-column-number/solutions/849149/excelbiao-lie-xu-hao-by-leetcode-solutio-r29l/
     */
    class Solution {
        public int titleToNumber(String columnTitle) {
            int number = 0;
            int multiple = 1;
            for (int i = columnTitle.length() - 1; i >= 0; i--) {
                int k = columnTitle.charAt(i) - 'A' + 1;
                number += k * multiple;
                multiple *= 26;
            }
            return number;
        }
    }

}
